/**
 * 常用格式化工具函数
 */

import { calculateDurationInSeconds } from '@/utils/date'

/**
 * 格式化金额
 * @param amount 金额
 * @param decimals 保留小数位数
 * @returns string
 */
export function formatAmount(amount: number | string, decimals = 2): string {
  if (!amount)
    return '0.00'
  return Number(amount).toFixed(decimals)
}

/**
 * 格式化手机号
 * @param phone 手机号
 * @returns string
 */
export function formatPhone(phone: string): string {
  if (!phone)
    return ''
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}

/**
 * 格式化日期
 * @param date 日期
 * @param format 格式
 * @returns string
 */
export function formatDate(date: Date | string | number, format = 'YYYY-MM-DD HH:mm:ss'): string {
  const d = new Date(date)
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minute = d.getMinutes()
  const second = d.getSeconds()

  const formatNumber = (n: number) => {
    return n < 10 ? `0${n}` : `${n}`
  }

  return format
    .replace('YYYY', String(year))
    .replace('MM', formatNumber(month))
    .replace('DD', formatNumber(day))
    .replace('HH', formatNumber(hour))
    .replace('mm', formatNumber(minute))
    .replace('ss', formatNumber(second))
}

/**
 * 格式化文件大小
 * @param size 文件大小（字节）
 * @returns string
 */
export function formatFileSize(size: number): string {
  if (!size)
    return '0B'
  const units = ['B', 'KB', 'MB', 'GB', 'TB']
  let index = 0
  while (size >= 1024 && index < units.length - 1) {
    size /= 1024
    index++
  }
  return size.toFixed(2) + units[index]
}

/**
 * 格式化数字（每三位加逗号）
 * @param num 数字
 * @returns string
 */
export function formatNumber(num: number | string): string {
  return String(num).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

/**
 * 格式化百分比
 * @param value 百分比值（0-1之间的数字）
 * @returns string
 */
export function formatPercentage(value: number): string {
  if (value < 0 || value > 1) {
    throw new Error('百分比值必须在0到1之间')
  }

  const percentage = (value * 100).toFixed(2)
  return percentage.endsWith('.00') ? percentage.slice(0, -3) : percentage.endsWith('00') ? percentage.slice(0, -2) : percentage
}

/**
 * 格式化上课时间和下课时间
 * @param startTime 上课时间
 * @param endTime 下课时间
 * @returns string 格式化的时间段和持续时间
 */
export function formatClassTime(startTime: string, endTime: string): string {
  const classTime = formatClassTimeSimple(startTime, endTime)
  const duration = formatLessonDuration(startTime, endTime)
  return `${classTime} ${duration}`
}

/**
 * 格式化上课时间（只展示几点到几点）
 * @param startTime 上课时间
 * @param endTime 下课时间
 * @returns string 格式化的时间段
 */
export function formatClassTimeSimple(startTime: string, endTime: string): string {
  const start = new Date(startTime)
  const end = new Date(endTime)

  const startHours = String(start.getHours()).padStart(2, '0')
  const startMinutes = String(start.getMinutes()).padStart(2, '0')
  const endHours = String(end.getHours()).padStart(2, '0')
  const endMinutes = String(end.getMinutes()).padStart(2, '0')

  return `${startHours}:${startMinutes}~${endHours}:${endMinutes}`
}

/**
 * 格式化上课时长
 * @param startTime 上课开始时间
 * @param endTime 上课结束时间
 * @returns string 格式化的上课时长
 */
export function formatLessonDuration(startTime: string, endTime: string): string {
  const start = new Date(startTime)
  const end = new Date(endTime)
  const durationInSeconds = (end.getTime() - start.getTime()) / 1000
  const durationInMinutes = Math.floor(durationInSeconds / 60)
  const hours = Math.floor(durationInMinutes / 60)
  const minutes = durationInMinutes % 60

  if (hours > 0) {
    return `${hours}小时${minutes > 0 ? ` ${minutes}分钟` : ''}`
  }
  else {
    return `${minutes}分钟`
  }
}

/**
 * 格式化数字，主要是把null转换为0
 * @param num 数字
 * @returns number
 */
export function formatNumberWithNull(num: number | null): number {
  return num === null ? 0 : num
}
